# Create your views here.
from datos_taxonomicos.forms import DatoForm, ReinoForm, PhylumForm, ClaseForm, \
    FamiliaForm, GeneroForm, EspecieForm, OrdenForm
from datos_taxonomicos.models import Dato, Reino, Phylum, Clase, Familia, Genero, \
    Especie, Orden
from datos_taxonomicos.utils import get_form_for_object_dato
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.db.models.query import EmptyQuerySet
from django.shortcuts import get_object_or_404, render_to_response
from django.template.context import RequestContext
from django.views.generic.create_update import update_object, create_object, \
    delete_object
from django.views.generic.list_detail import object_list, object_detail
from usuarios.permisos import es_del_grupo_de_expertos, es_del_grupo_de_admins


def listar(request):    #seria la pagina de inicio para las datoTaxs
    return object_list(request,
                       queryset = Dato.objects.all(),
                       paginate_by = 8,
                       allow_empty = True,
                       template_name = 'datos_taxonomicos/listar.html',
                       extra_context = {'todo' : 'class=active','tipo_de_dato':'todo','ordenar_por':'todo'}
                       )
   
def listar_por(request,listar_por):    #seria la pagina de inicio para las datoTaxs
    q = EmptyQuerySet()
    active = 'todo'
    if listar_por == 'todo':
        q = Dato.objects.all()
    if listar_por == 'nombre':
        q = Dato.objects.all().order_by('nombre')
    if listar_por == 'tipo':
        q = Dato.objects.all().order_by('real_type')
    if listar_por == 'reino':
        q = Dato.objects.filter(real_type__name = 'reino')
        active = 'reino'
    if listar_por == 'phylum':
        q = Dato.objects.filter(real_type__name = 'phylum')
        active = 'phylum'
    if listar_por == 'clase':
        q = Dato.objects.filter(real_type__name = 'clase')
        active = 'clase'
    if listar_por == 'orden':
        q = Dato.objects.filter(real_type__name = 'orden')
        active = 'orden'
    if listar_por == 'familia':
        q = Dato.objects.filter(real_type__name = 'familia')
        active = 'familia'
    if listar_por == 'genero':
        q = Dato.objects.filter(real_type__name = 'genero')
        active = 'genero'
    if listar_por == 'especie':
        q = Dato.objects.filter(real_type__name = 'especie')
        active = 'especie'
    return object_list(request,
                       queryset = q,
                       paginate_by = 8,
                       allow_empty = True,
                       template_name = 'datos_taxonomicos/listar.html',
                       extra_context = {active : 'class=active','tipo_de_dato':active,'ordenar_por':'todo'}
                       )
    
    
    
    
def listar_por_ordenar(request,listar_por,ordenar_por):    #seria la pagina de inicio para las datoTaxs
    q = EmptyQuerySet()
    active = 'todo'
    if listar_por == 'todo':
        q = Dato.objects.all()
    if listar_por == 'reino':
        q = Dato.objects.filter(real_type__name = 'reino')
        active = 'reino'
    if listar_por == 'phylum':
        q = Dato.objects.filter(real_type__name = 'phylum')
        active = 'phylum'
    if listar_por == 'clase':
        q = Dato.objects.filter(real_type__name = 'clase')
        active = 'clase'
    if listar_por == 'orden':
        q = Dato.objects.filter(real_type__name = 'orden')
        active = 'orden'
    if listar_por == 'familia':
        q = Dato.objects.filter(real_type__name = 'familia')
        active = 'familia'
    if listar_por == 'genero':
        q = Dato.objects.filter(real_type__name = 'genero')
        active = 'genero'
    if listar_por == 'especie':
        q = Dato.objects.filter(real_type__name = 'especie')
        active = 'especie'
        
    if ordenar_por == 'nombre':
        q = q.order_by('nombre')
    if ordenar_por == 'tipo':
        q = q.order_by('real_type')
    return object_list(request,
                       queryset = q,
                       paginate_by = 8,
                       allow_empty = True,
                       template_name = 'datos_taxonomicos/listar.html',
                       extra_context = {active : 'class=active','tipo_de_dato':active,'ordenar_por':ordenar_por}
                       )

@login_required
def ver(request, object_id):
    dato = get_object_or_404(Dato, pk=object_id)
    generos = None
    especies = None
    familias = None
    ordenes = None
    clases = None
    phylums = None
    reino = ''
    phylum = ''
    clase = ''
    orden = ''
    familia = ''
    genero = ''
    template_name = ''
    if dato.cast()._meta.verbose_name == 'reino':
        phylums = Phylum.objects.filter(reino = dato.cast())
        clases = Clase.objects.filter(phylum__reino = dato.cast())
        ordenes = Orden.objects.filter(clase__phylum__reino = dato.cast())
        familias = Familia.objects.filter(orden__clase__phylum__reino = dato.cast())
        generos = Genero.objects.filter(familia__orden__clase__phylum__reino = dato.cast())
        especies = Especie.objects.filter(genero__familia__orden__clase__phylum__reino = dato.cast())
        template_name = 'datos_taxonomicos/reino.html'
    
    if dato.cast()._meta.verbose_name == 'phylum':
        clases = Clase.objects.filter(phylum = dato.cast())
        ordenes = Orden.objects.filter(clase__phylum = dato.cast())
        familias = Familia.objects.filter(orden__clase__phylum = dato.cast())
        generos = Genero.objects.filter(familia__orden__clase__phylum = dato.cast())
        especies = Especie.objects.filter(genero__familia__orden__clase__phylum = dato.cast())
        template_name = 'datos_taxonomicos/phylum.html'
    
    if dato.cast()._meta.verbose_name == 'clase':
        ordenes = Orden.objects.filter(clase = dato.cast())
        familias = Familia.objects.filter(orden__clase = dato.cast())
        generos = Genero.objects.filter(familia__orden__clase = dato.cast())
        especies = Especie.objects.filter(genero__familia__orden__clase = dato.cast())
        template_name = 'datos_taxonomicos/clase.html'
    
    if dato.cast()._meta.verbose_name == 'orden':
        familias = Familia.objects.filter(orden = dato.cast())
        generos = Genero.objects.filter(familia__orden = dato.cast())
        especies = Especie.objects.filter(genero__familia__orden = dato.cast())
        template_name = 'datos_taxonomicos/orden.html'
    if dato.cast()._meta.verbose_name == 'familia':
        generos = Genero.objects.filter(familia = dato.cast())
        especies = Especie.objects.filter(genero__familia = dato.cast())
        template_name = 'datos_taxonomicos/familia.html'
    if dato.cast()._meta.verbose_name == 'genero':
        especies = Especie.objects.filter(genero = dato.cast())
        template_name = 'datos_taxonomicos/genero.html'
    if dato.cast()._meta.verbose_name == 'especie':
        template_name = 'datos_taxonomicos/especie.html'
    return object_detail(request,
                         queryset = Dato.objects.all(),
                         template_object_name =  "Dato",
                         extra_context = {'generos':generos,
                                          'especies':especies,
                                          'familias':familias,
                                          'ordenes': ordenes,
                                          'clases':clases,
                                          'phylums':phylums},
                         template_name = template_name,
                         object_id = object_id
                         ) 
@login_required
def listar_opciones_para_crear(request):
    c = {}
    c.update({'user':request.user})  
    c.update(csrf(request))
    c.update() 
    return render_to_response("datos_taxonomicos/listar_opciones_para_crear.html", c,context_instance=RequestContext(request))

@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def crear(request,tipo_de_dato):
    model_a_pasar, form_a_pasar = get_form_for_object_dato(tipo_de_dato)
    return create_object(request, 
                         model = model_a_pasar,
                         form_class = form_a_pasar,
                         template_name = 'datos_taxonomicos/crear.html', 
                         post_save_redirect = '/datos_taxs/'
                         )     

@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def editar(request, object_id):
    dato = get_object_or_404(Dato, pk=object_id)
    return update_object(request,
                         model = dato.cast().__class__,
                         template_name = 'datos_taxonomicos/editar.html', 
                         post_save_redirect = '/datos_taxs/' + object_id,
                         object_id = object_id
                         )


@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def eliminar(request, object_id):
    get_object_or_404(Dato, pk=object_id)
    return delete_object(request,
                         model = Dato, 
                         template_name = 'datos_taxonomicos/confirmar_eliminar.html', 
                         post_delete_redirect = '/datos_taxs/',
                         object_id = object_id
                         )
